#include <16F628A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000)

#define lcd_enable     pin_a0      //A0(17) pino enable(6) do LCD 
#define lcd_rs         pin_b3      //B3(9) pino RS(4) do LCD
#define lcd_d4         pin_b4      //B4(10) pino de sdados d4 do LCD
#define lcd_d5         pin_b5      //B5(11) pino de dados d5 do LCD
#define lcd_d6         pin_b6      //B6(12) pino de dados d6 do LCD
#define lcd_d7         pin_b7      //B7(13) pino de dados d7 do LCD

#include "mod_lcd.c"

char display = 1;
char reader = 2;
#define RS485_ID display

#include "rs485_multi.c"

int1 redeOK = FALSE;

unsigned int8 msgsz;
unsigned char msg[40];

void getMsg()
{
/*
   0 - start byte
   1 - packet number
   2 - len
   3 - from
   4 - to
   5 - data (command)
   last - sum
*/
   int i;
   if(msg[4] == display)
   {
      if(!redeOK)
      {  
         redeOK = TRUE;
         printf(lcd_escreve,"\rREDE OK         ");
      }
   }
   else if(msg[4] == reader)
   {
      if((msg[5] == 3||msg[5] == 4) && msg[3] == 0) //resposta do reader pra mostrar no display
      {
         lcd_apaga();
         for(i=0;i<(msg[2]-1);++i)
         {
            lcd_escreve(msg[i+6]);
            if(i==15) lcd_escreve('\n');
         }
      }
   }   
}

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(GLOBAL);
   
   redeOK = FALSE;
   //readerOK = FALSE;

   rs485_init();
   lcd_ini();
   lcd_apaga();
   printf(lcd_escreve,"TERM: %d LEITR: %d\n",display,reader);
   printf(lcd_escreve,"CHECANDO REDE:\r");
   
   if(!rs485_send_message(0x00, 1, 0x00))
   {
      printf(lcd_escreve,"AGUARDANDO REDE:\r");
   }
   else
   {
      redeOK = TRUE;
      printf(lcd_escreve,"REDE OK         \r");
   }
      
   while(true)
   {
      msgsz = rs485_get_message(&(msg[0]));
      if(msgsz>0) getMsg();
      //sleep();
   }
}



